/*
 * @Description: axios中间件（初始化和全局配置）
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2020-08-06 13:16:24
 * @LastEditTime: 2023-03-29 10:11:47
 */
import axios from "axios";
import myLoading from "./Loading";
import myMessage from "./Message";

//初始化
const Axios: any = axios.create({
  baseURL: import.meta.env.VITE_BASE_API, //api路径
  withCredentials: true, // 跨域时允许设置cookie
  timeout: 10000, //超时
});

// token
let Token: string;

//请求前钩子
Axios.interceptors.request.use(
  (config: any) => {
    // 加载loading
    myLoading.show();
    // 由于执行请求时token可能已经改变，故每次请求前都要重新获取token
    // 待修改
    Token = sessionStorage.getItem("_token")!;
    if (Token) {
      // 判断是否存在token，如果存在的话，则每个http header都加上token
      config.headers["token"] = Token;
    }
    return config;
  },
  (error: any) => {
    // myLoading.hide() // 关闭loading
    console.error("[Request error]: " + error);
  }
);

//响应后钩子
Axios.interceptors.response.use(
  (response: any) => {
    // 关闭loading
    myLoading.hide();

    // 对响应数据做些事
    // 待修改
    if (response.status !== 200 || !response.data.ok) {
      myMessage.error(response.data.msg);
      console.error("[Request error]: " + response.data.msg);
    } else if (typeof response.data === "string") {
      try {
        response.data = JSON.parse(response.data);
      } catch (error) {
        console.error("[JSON-Parse error]: " + error);
      }
    }

    // 更新token
    // const newToken = response.headers['token'];
    // if (newToken && newToken !== Token) {
    //   sessionStorage.setItem("_token", newToken);
    // }

    return response.data;
  },
  (error: any) => {
    myLoading.hide(); // 关闭loading

    // 代码层面出错
    if (!error.response) {
      const msg = error.toString();
      myMessage.error(msg); //错误提示
      console.error("[Request error]: " + error);
      return { status: 0, msg };
    }
    // 后端返回异常
    const { status, data, statusText } = error.response;
    setTimeout(() => {
      if (status === 404) {
        myMessage.error(
          `${status}: ${statusText}（${error.response.config.url}）`
        ); //错误提示
      } else {
        // 待修改
        myMessage.error(data.msg); //错误提示
      }
    }, 100);
    return data;
  }
);

export default Axios;
